在傳統開發中,初學者常會把資料庫連線字串(如 localhost:3306)或環境名稱(如 dev / prod)直接寫死在程式碼中,或者直接打進 Docker Image。
這會帶來極大的維運災難:
docker build 並推送到 Registry。Kubernetes ConfigMap 正是為了實現**「程式碼與設定分離」**而生的關鍵物件。
核心思維:同一個 Docker Image,在 Dev 環境掛載 Dev ConfigMap;在 Prod 環境掛載 Prod ConfigMap,完全不需要重新建置映像檔!
ConfigMap 本質上就是一個由 Key-Value(鍵值對) 組成的設定儲存庫。它的 Value 可以是:
APP_COLOR: blue)nginx.conf、application.properties 的整段文字)這是最常見且最輕量的方式,適合簡單的設定參數。
app-config.yamlapiVersion: v1
kind: ConfigMap
metadata:
name: app-env-config
data:
APP_ENV: "production"
MAX_CONNECTIONS: "100"
建立 pod-env.yaml,透過 valueFrom.configMapKeyRef 引入變數:
apiVersion: v1
kind: Pod
metadata:
name: test-env-pod
spec:
containers:
- name: app
image: busybox
command: ["sh", "-c", "echo App is running in $APP_ENV mode with limit$MAX_CONNECTIONS; sleep 3600"]
env:
- name: APP_ENV
valueFrom:
configMapKeyRef:
name: app-env-config
key: APP_ENV
- name: MAX_CONNECTIONS
valueFrom:
configMapKeyRef:
name: app-env-config
key: MAX_CONNECTIONS
kubectl apply -f app-config.yaml
kubectl apply -f pod-env.yaml
# 查看 Pod 印出的 log
kubectl logs test-env-pod
預期輸出:
App is running in production mode with limit 100
當你的應用程式依賴特定的設定檔(例如 Nginx 的 default.conf 或 JSON 檔)時,直接掛載為檔案最為方便。
建立 web-page-config.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: nginx-index-config
data:
index.html: |
<!DOCTYPE html>
<html>
<head><title>K8s ConfigMap Demo</title></head>
<body style="background-color: #f0f8ff; text-align: center; margin-top: 50px;">
<h1>Hello from ConfigMap Mounted File!</h1>
<p>This HTML content is injected from a Kubernetes ConfigMap dynamically.</p>
</body>
</html>
建立 nginx-config-pod.yaml:
apiVersion: v1
kind: Pod
metadata:
name: nginx-custom-pod
spec:
containers:
- name: web
image: nginx:1.25
ports:
- containerPort: 80
volumeMounts:
- name: html-volume
mountPath: /usr/share/nginx/html # Nginx 預設網頁目錄
volumes:
- name: html-volume
configMap:
name: nginx-index-config # 對應 ConfigMap 名稱
kubectl apply -f web-page-config.yaml
kubectl apply -f nginx-config-pod.yaml
# 建立本機端口轉發
kubectl port-forward pod/nginx-custom-pod 8080:80
打開瀏覽器訪問 http://localhost:8080,即可看到完全由 ConfigMap 動態注入的自訂 HTML 頁面!
ConfigMap 雖然好用,但它完全沒有加密(資料全是以明文 Plaintext 儲存)。
今天我們學會了如何使用 ConfigMap 讓「環境設定」與「映像檔」徹底解耦:
env 注入為環境變數。volumeMounts 作為實體檔案掛載。經過前面幾天的洗禮,我們已經掌握了 Deployment(運算)、Service & Ingress(網路)以及 ConfigMap(設定)。
明天 Day 14,我們要迎來第二週的總驗收實戰:「【實作】雙層架構部署:Web 前端 + 後端 API 在 K8s 上的通訊整合」!